1 //+------------------------------------------------------------------+
\r
2 //| Moving Average.mq4 |
\r
3 //| Copyright © 2005, MetaQuotes Software Corp. |
\r
4 //| http://www.metaquotes.net/ |
\r
5 //+------------------------------------------------------------------+
\r
6 #define MAGICMA 20050610
\r
8 extern double Lots = 0.1;
\r
9 extern double MaximumRisk = 0.02;
\r
10 extern double DecreaseFactor = 3;
\r
11 extern double MovingPeriod = 12;
\r
12 extern double MovingShift = 6;
\r
13 //+------------------------------------------------------------------+
\r
14 //| Calculate open positions |
\r
15 //+------------------------------------------------------------------+
\r
16 int CalculateCurrentOrders(string symbol)
\r
20 for(int i=0;i<OrdersTotal();i++)
\r
22 if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
\r
23 if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
\r
25 if(OrderType()==OP_BUY) buys++;
\r
26 if(OrderType()==OP_SELL) sells++;
\r
29 //---- return orders volume
\r
30 if(buys>0) return(buys);
\r
31 else return(-sells);
\r
33 //+------------------------------------------------------------------+
\r
34 //| Calculate optimal lot size |
\r
35 //+------------------------------------------------------------------+
\r
36 double LotsOptimized()
\r
39 int orders=HistoryTotal(); // history orders total
\r
40 int losses=0; // number of losses orders without a break
\r
41 //---- select lot size
\r
42 lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);
\r
43 //---- calcuulate number of losses orders without a break
\r
44 if(DecreaseFactor>0)
\r
46 for(int i=orders-1;i>=0;i--)
\r
48 if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }
\r
49 if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
\r
51 if(OrderProfit()>0) break;
\r
52 if(OrderProfit()<0) losses++;
\r
54 if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
\r
56 //---- return lot size
\r
57 if(lot<0.1) lot=0.1;
\r
60 //+------------------------------------------------------------------+
\r
61 //| Check for open order conditions |
\r
62 //+------------------------------------------------------------------+
\r
67 //---- go trading only for first tiks of new bar
\r
68 if(Volume[0]>1) return;
\r
69 //---- get Moving Average
\r
70 ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
\r
71 //---- sell conditions
\r
72 if(Open[1]>ma && Close[1]<ma)
\r
74 res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);
\r
77 //---- buy conditions
\r
78 if(Open[1]<ma && Close[1]>ma)
\r
80 res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);
\r
85 //+------------------------------------------------------------------+
\r
86 //| Check for close order conditions |
\r
87 //+------------------------------------------------------------------+
\r
88 void CheckForClose()
\r
91 //---- go trading only for first tiks of new bar
\r
92 if(Volume[0]>1) return;
\r
93 //---- get Moving Average
\r
94 ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
\r
96 for(int i=0;i<OrdersTotal();i++)
\r
98 if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
\r
99 if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
\r
100 //---- check order type
\r
101 if(OrderType()==OP_BUY)
\r
103 if(Open[1]>ma && Close[1]<ma) OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
\r
106 if(OrderType()==OP_SELL)
\r
108 if(Open[1]<ma && Close[1]>ma) OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
\r
114 //+------------------------------------------------------------------+
\r
115 //| Start function |
\r
116 //+------------------------------------------------------------------+
\r
119 //---- check for history and trading
\r
120 if(Bars<100 || IsTradeAllowed()==false) return;
\r
121 //---- calculate open orders by current symbol
\r
122 if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
\r
123 else CheckForClose();
\r
126 //+------------------------------------------------------------------+